

#include <iostream>
#include <unistd.h>
#include <vector>
#include <cstdio>
#include "Thread.hpp"
#include "LockGuard.hpp"

using namespace ThreadMoudle;

const int gnum = 10;
static int threadnum = 4;

int tickets = 10000;
pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;

// void Print(const std::string &name)
// {
//     int cnt = 1;
//     while (true)
//     {
//         std::cout << name << " is running, cnt: " << cnt++ << std::endl;
//         sleep(1);
//     }
// }


// void route(const std::string &name)
// {
//     while (true)
//     {
//         pthread_mutex_lock(&gmutex);
//         if (tickets > 0)
//         {
//             // 抢票 
//             usleep(1000); // 1ms 表示抢票花费的时间 
//             printf("%s get a ticket: %d\n", name.c_str(), tickets--);
//             pthread_mutex_unlock(&gmutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&gmutex);
//             break;
//         }
//     }
// }

// void route(ThreadData* td)
// {
//     while (true) 
//     {
//         pthread_mutex_lock(td->GetLock());
//         if (tickets > 0)
//         {
//             // 抢票 
//             usleep(1000); // 1ms 表示抢票花费的时间 
//             printf("%s get a ticket: %d\n", td->GetName().c_str(), tickets--);
//             pthread_mutex_unlock(td->GetLock());
//         }
//         else
//         {
//             pthread_mutex_unlock(td->GetLock());
//             break;
//         }
//     }
// }

void route(ThreadData* td)
{
    while (true)
    {
        LockGuard lockguard(td->GetLock()); // RAII 风格锁 
        if (tickets > 0)
        {
            // 抢票 
            usleep(1000); // 1ms 表示抢票花费的时间 
            printf("%s get a ticket: %d\n", td->GetName().c_str(), tickets--);
        }
        else
        {
            break;
        }
    }
}


// 抢票代码 

int main()
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, nullptr);

    std::vector<Thread> threads;
    for (int i = 0; i < threadnum; ++i)
    {
        std::string name = "thread-" + std::to_string(i + 1);
        ThreadData* td = new ThreadData(name, &mutex);
        threads.emplace_back(name, route, td);
    }

    for (auto& thread : threads)
    {
        thread.Start();
    }

    for (auto& thread : threads)
    {
        thread.Join();
    }

    pthread_mutex_destroy(&mutex);
    return 0;
}



// int main()
// {
//     Thread t1("thread-1", route);
//     Thread t2("thread-2", route);
//     Thread t3("thread-3", route);
//     Thread t4("thread-4", route);

//     t1.Start();
//     t2.Start();
//     t3.Start();
//     t4.Start();


//     t1.Join();
//     t2.Join();
//     t3.Join();
//     t4.Join();
//     return 0;
// }



// 创建一批线程 
// int main()
// {
//     // 构建线程对象 
//     std::vector<Thread> threads;
//     for (int i = 0; i < gnum; ++i)
//     {
//         std::string name = "thread-" + std::to_string(i + 1);
//         threads.emplace_back(name, Print);
//     }

//     // 统一启动 
//     for (auto& thread : threads)
//     {
//         thread.Start();
//     }

//     sleep(10);

//     // 统一结束 
//     for (auto& thread : threads)
//     {
//         thread.Stop();
//     }

//     // 统一等待 
//     for (auto& thread : threads)
//     {
//         thread.Join();
//     }
//     return 0;
// }



// 线程封装 
// int main()
// {
//     Thread t("thread-1", Print);
//     std::cout << t.GetName() << " status: " << t.Status() << std::endl;

//     t.Start();
//     sleep(10);
//     std::cout << t.GetName() << " status: " << t.Status() << std::endl;

//     t.Stop();
//     sleep(1);
//     std::cout << t.GetName() << " status: " << t.Status() << std::endl;

//     t.Join();
//     std::cout << "join done..." << std::endl;
//     return 0;
// }

